#include "../include/log_in.h"

// 声明函数
// 登陆的密码验证
Log_in_data log_in(Double_Link_List *list_1, Double_Link_List *list_2)
{
    Log_in_data log_data;
    Double_Node *ptr = NULL;
    memset(&log_data, 0, sizeof(log_data));     //清空数据
    //安全判断
    if (NULL == list_1 || NULL == list_2)
    {
        ERRLOG("链表的动态空间为空");
        return log_data;
    }
    // 登陆次数控制
    int num = 0;
    int select = 0; //登录选择 1-管理员 2-普通用户
    printf("请选择你的身份:1-管理员\t2-普通用户\n");
    scanf("%d",&select);
    while (1)
    {
        // 用户输入账号以及密码
        printf("输入你的账号:");
        scanf("%s", log_data.name);
        printf("输入你的密码:");
        scanf("%s", log_data.password);

        //  判断普通用户输入的信息是否正确
        if (select==2)
        {
            if (NULL != (ptr = find_double_node_name(list_1, log_data.name)))
            {
                if (!strcmp(ptr->data.password, log_data.password))
                {
                    printf("登陆成功\n");
                    log_data = ptr->data;
                    return log_data;
                }
            }
            else
            {
                printf("账号或密码输入有误!\n");
                num++;
            }
        }

        //  判断管理员输入的信息是否正确
        if (select==1)
        {
            if (NULL != (ptr = find_double_node_name(list_2, log_data.name)))
            {
                if (!strcmp(ptr->data.password, log_data.password))
                {
                    printf("登陆成功\n");
                    log_data = ptr->data;
                    return log_data;
                }
            }
            else
            {
                printf("账号或密码输入有误!\n");
                num++;
            }
        }
        //限制用户输入次数
        juge_in_times(&num);
    }
}

// 注册
void reg(Double_Link_List *list)
{
    //安全判断
    if (NULL == list)
    {
        ERRLOG("链表的动态空间为空");
        return;
    }
    //接受用户输入的注册信息
    Log_in_data reg_data;
    reg_data.id = 0;        //初始化用户权限
    char ch[128];     //用于确认密码信息
    printf("请输入你的用户名:");
    scanf("%s",reg_data.name);

    printf("请输入你的密码:");
    scanf("%s", reg_data.password);

    printf("请再次确认你的密码:");
    scanf("%s", ch);
    if (strcmp(reg_data.password,ch))
    {
        printf("两次密码不一致!,请重新输入!\n");
    }
    printf("注册成功!请重新登录!\n");

    // 头插插入到链表
    insert_double_node(list,reg_data,1);

    // 写入到文件
    F_print(list,User_data,"a");
}

//修改用户信息
void root_modify(Double_Link_List *users_list, Double_Link_List *root_list,char *name)
{
    if (NULL == users_list)
    {
        ERRLOG("链表的动态空间为空");
        return;
    }

    Double_Node *ptr = find_double_node_name(users_list, name);   // 返回该用户的结点
    int pos = find_pos(users_list, name);                        // 返回该用户的位置
    int num = 0;
    char buf[128];
    printf("请输入你需要修改的信息 1-账号\t2-密码\t3-升级权限:\n");
    scanf("%d", &num);
    switch (num)
    {
    case 1:
        printf("请输入你的账号");
        scanf("%s", buf);
        strcpy(ptr->data.name, buf);
        printf("账号修改成功 账号为 %s\n", buf);
        //覆盖写入到文件
        F_print(users_list, User_data, "w+");
        break;
    case 2:
        printf("请输入你的密码");
        scanf("%s", buf);
        if (!strcmp(ptr->data.password, buf))
        {
            printf("你个笨蛋 新密码 不能和旧密码相同\n");
            return;
        }
        strcpy(ptr->data.password, buf);
        printf("密码修改成功 密码为 %s\n", buf);
        // 覆盖写入到用户信息文件
        F_print(users_list, User_data, "w+");
        break;
    case 3:
        ptr->data.id = 1;
        printf("恭喜 \"%s\" 用户 成功升级为 svip\n", ptr->data.name);
        // 将该普通用户信息从普通用户信息中删除
        delete_double_node(users_list, pos);
        // 覆盖写入到用户信息文件
        F_print(users_list, User_data, "w+");
        // 将该普通用户的信息插入到管理员信息中
        Log_in_data new_data;
        strcpy(new_data.name, name);
        strcpy(new_data.password, buf);
        new_data.id = 1;
        insert_double_node(root_list, new_data, 1); // 头插写入
        // print_forward_double_link_list(root_list);
        // print_forward_double_link_list(users_list);
        // 追加写入到管理员信息文件
        F_print(root_list, Root_data, "w+");
        break;
    default:
        break;
    }
}

// 定义进度条函数
void progress_bar(int seconds)
{
    system("clear");                             // 清除屏幕
    char buffer[100 + 1] = {0};                  // 存储进度条字符
    char arr[5] = {"-/|\\"};                     // 存储基本的变化字符
    int usleep_time = (seconds * 1000000) / 100; // 计算每次循环等待的微秒数

    for (int i = 0; i <= 100; ++i)
    {
        // 更新进度条
        for (int j = 0; j < i; ++j)
        {
            buffer[j] = '>';
        }
        buffer[i] = '\0'; // 确保字符串正确结束

        // 打印进度条
        printf("[%-100s][%d%%][%c]\r", buffer, (i * 100) / 100, arr[i % 4]);
        fflush(stdout); // 确保立即输出

        // 等待指定的微秒数
        usleep(usleep_time);
    }
    printf("\n"); // 进度条完成后换行
}

// 定义判断用户输入错误函数
void juge_in_times(int *num)
{
    // 判断输入次数是否超过三次,超过则需等待三秒
    if (*num == 3)
    {
        *num = 0; // 重新清0,方便下次判断
        puts("用户名和密码累计输错3次!请3秒后重新输入!");
        sleep(1.5);
        progress_bar(3);
    }
}